//
//  JKStatusListViewModel.swift
//  新浪微博
//
//  Created by Jack.Lin on 16/7/2.
//  Copyright © 2016年 Jack.Lin. All rights reserved.
//

import UIKit
import SDWebImage

private let maxPullupTryTimes = 3

class JKStatusListViewModel: NSObject {
    
    
    
    // 微博视图模型数组懒加载
    lazy var statusList = [JKStatusViewModel]()
    
    private var pullupErrorTimes = 0
    
    func loadStatus(pullup: Bool, completion: (isSuccess: Bool, shouldRefresh: Bool) -> ()) {
        
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            completion(isSuccess: true, shouldRefresh: false)
            
            return
        }
        
        let since_id = pullup ? 0 : (statusList.first?.status?.id ?? 0)
        
        let max_id = !pullup ? 0 : (statusList.last?.status?.id ?? 0)
        
        // 让数据访问层加载数据
        JKstatusListDAL.loadStatus(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            
        // 发起网络请求, 加载微博数据[字典的数组]
//       JKNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            // 0 判断网络请求是否成功
            if !isSuccess {
               
                completion(isSuccess:false, shouldRefresh: false)
                return
            }
            
            
            // 1. 字典转模型 (所有第三方框架都支持嵌套的字典转模型!)
//            guard let array = NSArray.yy_modelArray(with: JKStatus.self, json: list ?? []) as? [JKStatus] else {
//                completion(isSuccess: isSuccess, shouldRefresh: false)
//                return
//            }
            // 1> 定义数组
            var array = [JKStatusViewModel]()
            // 2> 遍历服务器返回的字典数组, 字典转模型
        
            for dict in list ?? [] {
               
                print(dict["pic_urls"])
                // a) 创建微博模型 - 如果创建模型失败, 继续后续遍历
                guard let model = JKStatus.yy_model(with: dict) else {
                    continue
                }

                // b) 将视图模型 添加到数组
                array.append(JKStatusViewModel(model: model))
                
            }
            
            print("刷新到 \(array.count) 条数据 \(array)")
            
            // 2. 拼接数据
            if pullup {
              // 上拉刷新结束后, 将结果拼接在数组的末尾
                self.statusList += array
            } else {
                // 下拉刷新, 应该将结果数组拼接在数组前面
                self.statusList = array + self.statusList
            }
            // 3. 判读上啦刷新的数据数量
            if pullup && array.count == 0 {
               
                self.pullupErrorTimes += 1
                
                completion(isSuccess: isSuccess, shouldRefresh: false)
            } else {
                
                self.cacheSingleImage(list: array, finished: completion)
                
                // 4. 真正有数据的回调!
//                completion(isSuccess: isSuccess, shouldRefresh: true)
            }
            
        }
    }
    /// 缓存本次下载微博数据数组中的单张图像
    private func cacheSingleImage(list: [JKStatusViewModel], finished: (isSuccess: Bool, shouldRefresh: Bool)->()) {
    
        // 调度组
        let group = DispatchGroup()
        
        // 记录数据长度
        var length = 0

        
        for vm in list {
            
            if vm.picURLs?.count != 1 {
               continue
            }
            
            guard let pic = vm.picURLs?[0].thumbnail_pic,
                let url = URL(string: pic) else {
                continue
            }
            
            print("要缓存的 URL 是 \(url)")
            
            // 3> 下载图像
            // 1) downloadImage 是 SDWebImage 的核心方法
            // 2) 图像下载完成之后，会自动保存在沙盒中，文件路径是 URL 的 md5
            // 3) 如果沙盒中已经存在缓存的图像，后续使用 SD 通过 URL 加载图像，都会加载本地沙盒地图像
            // 4) 不会发起网路请求，同时，回调方法，同样会调用！
            // 5) 方法还是同样的方法，调用还是同样的调用，不过内部不会再次发起网路请求！
            // *** 注意点：如果要缓存的图像累计很大，要找后台要接口！
           
           group.enter()
            
        SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _, _) in
                
                // 将图像转换成二进制数据
            if let image = image,
                data = UIImagePNGRepresentation(image) {
                    
                // NSData 是 length 属性
                length += data.count
                
                // 图片缓存成功, 更新配图视图的大小
                vm.updataSingleImageSize(image: image)
            }
                
            print("缓存的图像是 \(image) 长度 \(length)")
            
            group.leave()
        })

    }
       
        group.notify(queue: DispatchQueue.main) {
         
            print("图像缓存完成 \(length / 1024) K")
            
            finished(isSuccess: true, shouldRefresh: true)
        }
        
        
    }
    
}


    
